package org.domain.sigepac.session;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

import org.domain.sigepac.Utils;
import org.domain.sigepac.Entity.Aluno;
import org.domain.sigepac.Entity.AvaliacaoPsicogenese;
import org.domain.sigepac.Entity.AvaliacaoPsicogeneseId;
import org.domain.sigepac.Entity.GrupoPsicogenese;
import org.domain.sigepac.Entity.Turma;
import org.domain.sigepac.home.EntityHomeSupport;
import org.domain.sigepac.repository.RepositorioAluno;
import org.domain.sigepac.repository.RepositorioAvaliacaoPsicogenese;
import org.domain.sigepac.repository.RepositorioGrupoPsicogenese;
import org.domain.sigepac.repository.RepositorioPsicogenese;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.datamodel.DataModel;
import org.jboss.seam.international.StatusMessages;

@Name("avaliacaoPsicogeneseHome")
@Scope(ScopeType.CONVERSATION)
public class AvaliacaoPsicogeneseHome extends EntityHomeSupport<AvaliacaoPsicogenese>{


	private static final long serialVersionUID = 3304750293587590855L;

	@In
	private StatusMessages statusMessages;

	@In
	private RepositorioPsicogenese repositorioPsicogenese;

	@In
	private RepositorioAluno repositorioAluno;

	@In
	private RepositorioAvaliacaoPsicogenese repositorioAvaliacaoPsicogenese;

	@In
	private RepositorioGrupoPsicogenese repositorioGrupoPsicogenese;

	private Aluno aluno;

	private Turma turma;

	private Date data=new Date();

	private HashMap<GrupoPsicogenese, AvaliacaoPsicogenese> novasAvaliacoes=new HashMap<GrupoPsicogenese, AvaliacaoPsicogenese>();

	@DataModel
	private List<AvaliacaoPsicogenese> avaliacoes;

	private List<AvaliacaoPsicogenese> todasAvaliacoes;



	public List<AvaliacaoPsicogenese> getAvaliacoes(GrupoPsicogenese grupo) {
		if(grupo!=null)
		{
			avaliacoes=new ArrayList<AvaliacaoPsicogenese>();
			for(AvaliacaoPsicogenese avaliacao:getTodasAvaliacoes()){
				if(avaliacao.getPsicogenese().getGrupo().equals(grupo))
					avaliacoes.add(avaliacao);
			}
		}

		return avaliacoes;
	}

	public AvaliacaoPsicogeneseHome() {
	}

	public List<AvaliacaoPsicogenese> getTodasAvaliacoes() {
		if(todasAvaliacoes==null){
			if(getTurma()!=null){
				todasAvaliacoes=aluno.getAvaliacoes(turma);
			}
		}
		return todasAvaliacoes;
	}


	public void salvar() throws CloneNotSupportedException{
		for(AvaliacaoPsicogenese avaliacao:novasAvaliacoes.values()){
			if(avaliacao.getPsicogenese()!=null){
				((AvaliacaoPsicogeneseId) avaliacao.getId()).setIdAluno((Integer) aluno.getId());
				((AvaliacaoPsicogeneseId) avaliacao.getId()).setIdTurma((Integer) turma.getId());
				((AvaliacaoPsicogeneseId) avaliacao.getId()).setIdPsicogenese((Integer) avaliacao.getPsicogenese().getId());
				repositorioAvaliacaoPsicogenese.inserir(avaliacao);
				Utils.entityManagerFlush();
			}
		}

		for(AvaliacaoPsicogenese avaliacao:todasAvaliacoes){
			AvaliacaoPsicogenese novo=new AvaliacaoPsicogenese();
			novo.setAluno(aluno);
			novo.setTurma(turma);
			novo.setPsicogenese(avaliacao.getPsicogenese());
			((AvaliacaoPsicogeneseId) novo.getId()).setIdAluno((Integer) aluno.getId());
			((AvaliacaoPsicogeneseId) novo.getId()).setIdTurma((Integer) turma.getId());
			((AvaliacaoPsicogeneseId) novo.getId()).setIdPsicogenese((Integer) novo.getPsicogenese().getId());

			avaliacao.setPsicogenese( repositorioPsicogenese.obterPorId( ((AvaliacaoPsicogeneseId) avaliacao.getId()).getIdPsicogenese()));

			repositorioAvaliacaoPsicogenese.atualizar(avaliacao,novo);
			Utils.entityManagerFlush();
		}

		updatedMessage();


	}

	public Integer getIdAluno(){
		return (Integer) getAluno().getId();
	}

	public void setIdAluno(Integer idAluno) {
		setAluno(repositorioAluno.obterPorId(idAluno));
	}


	public Date getData() {
		return data;
	}

	public void setData(Date data) {
		this.data = data;
	}

	public void setAluno(Aluno aluno) {
		this.aluno = aluno;
	}
	public Aluno getAluno() {
		return aluno;
	}

	public Turma getTurma() {
		return turma;
	}
	public void setTurma(Turma turma) {

		this.turma = turma;
	}

	public HashMap<GrupoPsicogenese, AvaliacaoPsicogenese> getNovasAvaliacoes() {
		if(novasAvaliacoes==null){
			novasAvaliacoes=new HashMap<GrupoPsicogenese, AvaliacaoPsicogenese>();
			List<GrupoPsicogenese> grupos=repositorioGrupoPsicogenese.listar();

			for(GrupoPsicogenese grupo:grupos)
			{
				AvaliacaoPsicogenese avaliacao=new AvaliacaoPsicogenese();
				avaliacao.setAluno(aluno);
				avaliacao.setTurma(turma);

				novasAvaliacoes.put(grupo, avaliacao);
			}
		}
		return novasAvaliacoes;
	}
	public void limpaNovasAvaliacoes(){
		novasAvaliacoes=null;
	}
	public void setNovasAvaliacoes(
			HashMap<GrupoPsicogenese, AvaliacaoPsicogenese> novasAvaliacoes) {
		this.novasAvaliacoes = novasAvaliacoes;
	}

	public AvaliacaoPsicogenese getNovaAvaliacao(GrupoPsicogenese grupo){
		return getNovasAvaliacoes().get(grupo);
	}
}
